package wsclient

import (
	"fmt"
	"gitee.com/851537/gbase"
	"github.com/cloudwego/hertz/pkg/app/server/binding"
	jsoniter "github.com/json-iterator/go"
)

type Msg struct {
	gbase.Base
	Cmd  int `json:"cmd" vd:"$>0;msg:'cmd need gt 0'"`
	Data any `json:"data"`
}

func (this *Msg) ToBytes() []byte {
	return this.Base.ToBytes(this)
}

// 绑定msg.Data到data,data must be pointer
func (this *Msg) BindVd(data any) error {
	if data == nil {
		return nil
	}
	if bdata, err := jsoniter.Marshal(this.Data); err != nil {
		return err
	} else if err = jsoniter.Unmarshal(bdata, data); err != nil {
		return err
	} else if err = binding.Validate(data); err != nil {
		return err
	}
	return nil
}

// args fmt = [cmd,data]
func NewMsg(args ...any) *Msg {
	msg := &Msg{}
	//msg.SendClients = treemap.NewWith(utils.Int64Comparator)
	if len(args) > 0 {
		msg.Cmd = args[0].(int)
		if len(args) > 1 {
			msg.Data = args[1]
		}
	}
	return msg
}

func NewErrMsg(data string, oriMsg ...*Msg) *Msg {
	if len(oriMsg) > 0 {
		data = fmt.Sprintf("%s oriMsg:%s", data, oriMsg[0].ToString(oriMsg[0]))
	}
	return NewMsg(CmdErr, data)
}
